# encoding: utf-8
# @File  : get_driver.py
# @Author: wu shaofan
# @Date  :  2024/04/18
# @Desc :  封装win和Linux环境下浏览器驱动对象
import sys
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from selenium import webdriver
import config

# 获取当前环境是win还是linux 如"win32"和 "linux"
system_driver = sys.platform
# print(f"当前环境是{system_driver}")


# 封装获取浏览器驱动对象
class GetDriver:
    # 设置类属性
    driver = None

    @classmethod
    def get_driver(cls, url):
        # 如果环境是win并且 cls.driver is None
        if system_driver == "win32" and cls.driver is None:
            driver_path = config.BASE_DIR + r'/tools/126.0.6478.57/chromedriver.exe'
            options = Options()
            # 取消chrome受自动控制提示---加上'enable-automation'，禁用自动化功能。
            # nable-logging'：启用日志记录功能。
            # excludeSwitches：排除哪些自动化的功能（如自动转到其他页面，如登录页面）
            options.add_experimental_option("excludeSwitches", ['enable-automation', 'enable-logging'])
            # 阻止显示"您可以通过Chrome菜单打开书签，阅读模式等"的提示---暂时没解决
            # options.add_argument('--disable-infobars')
            # 浏览器打开无恒模式
            options.add_argument('--incognito')

            # 3、关闭保存密码弹窗
            prefs = dict()
            prefs['credentials_enable_service'] = False
            prefs['profile.password_manager_enabled'] = False
            options.add_experimental_option('prefs', prefs)

            service = Service(driver_path)
            cls.driver = webdriver.Chrome(service=service, options=options)
            cls.driver.maximize_window()
            cls.driver.get(url)

            return cls.driver

        # 如果环境是linux并且 cls.driver is None
        elif system_driver.lower() == "linux" and cls.driver is None:
            driver_path = r'/var/jenkins_home/workspace/TPshop_webdemo_pro/chromedriver'
            # options = Options()
            # # 指定Chrome的路径 二进制
            # options.binary_location = "/usr/bin/google-chrome"
            # # 解决DevToolsActivePort文件不存在的报错
            # options.add_argument('--no-sandbox')  # 亲测 Debian 必须加，Ubuntu 随意
            # # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
            # options.add_argument("--headless")
            # # 谷歌文档提到需要加上这个属性来规避bug
            # options.add_argument('--disable-gpu')
            # # 大量渲染时候写入/tmp而非/dev/shm
            # options.add_argument('--disable-dev-shm-usage')
            # # 最大化运行（全屏窗口）,不设置，取元素会报错
            # options.add_argument('--start-maximized')
            # # # 指定远程调试端口
            # options.add_argument('--remote-debugging-port=9222')
            # service = Service(executable_path = driver_path)
            # cls.driver = webdriver.Chrome(service=service, options=options)
            # cls.driver.get(url)
            # return cls.driver

            chrome_options = Options()
            chrome_options.add_argument('--headless')  # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
            chrome_options.add_argument('--no-sandbox')  # 解决DevToolsActivePort文件不存在的报错
            chrome_options.add_argument('--disable-dev-shm-usage')  # 大量渲染时候写入/tmp而非/dev/shm
            chrome_options.add_argument('--disable-gpu')  # 谷歌文档提到需要加上这个属性来规避bug
            chrome_options.add_argument('-–single-process')  # 以单进程模式运行 Chromium。（启动时浏览器会给出不安全警告）
            chrome_options.add_argument('window-size=1920x1080')  # 指定浏览器分辨率
            chrome_options.add_argument('--start-maximized')  # 最大化运行（全屏窗口）,不设置，取元素会报错
            # chrome_options.add_argument('--user-data-dir=/data')
            chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
            chrome_options.add_experimental_option('useAutomationExtension', False)
            chrome_options.add_argument("--disable-features=VizDisplayCompositor")
            chrome_options.add_argument('--remote-debugging-port=9222')
            service = Service(driver_path)
            cls.driver = webdriver.Chrome(service=service, options=chrome_options)
            cls.driver.get(url)
            return cls.driver

    # 关闭浏览器
    @classmethod
    def quit_driver(cls):
        if cls.driver:
            cls.driver.quit()
            # 注意：此处有一个很大坑
            cls.driver = None

    # 关闭窗口
    @classmethod
    def close_driver(cls):
        if cls.driver:
            cls.driver.close()
            cls.driver = None
